﻿using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace Main.src.display
{

    /// <summary>
    /// Classe que armazena os DisplayObjects que serão desenhados
    /// e configurações de tela
    /// </summary>
    public static class Display
    {

        public static SpriteSortMode    SortMode          = SpriteSortMode.FrontToBack;   // Ordem de desenho
        public static BlendState        BlendState        = null;                         // Modo que alfa e cor são aplicados na projeção
        public static SamplerState      SamplerState      = null;                         // Modo que as texturas são desenhadas
        public static DepthStencilState DepthStencilState = null;                         // Controlador do buffer de profundidade
        public static RasterizerState   RasterizerState   = null;                         // Modo de desenho 3D sobre superfície 2D
        public static Effect            Effect            = null;                         // Efeito
        public static Matrix            TransformMatrix   = Matrix.Identity;              // Projeção

        public static readonly int Width  = Main.self.graphics.PreferredBackBufferWidth;  // Largura da tela
        public static readonly int Height = Main.self.graphics.PreferredBackBufferHeight; // Altura da tela

        private static readonly List<DisplayObject> Children = new List<DisplayObject>(); // Lista de DisplayObjects

        /// <summary>
        /// Adiciona um novo DisplayObject à lista
        /// </summary>
        /// <param name="child">Novo DisplayObject</param>
        public static void Add(DisplayObject child)
        {
            if (!Children.Contains(child))
                Children.Add(child);
        }

        /// <summary>
        /// Desenha todos os DisplayObjects da lista
        /// </summary>
        /// <param name="spriteBatch">SpriteBatch do Main</param>
        public static void Update(SpriteBatch spriteBatch)
        {
            spriteBatch.Begin(SortMode, BlendState, SamplerState, DepthStencilState, RasterizerState, Effect, TransformMatrix);
            foreach (DisplayObject child in Children)
                child.Draw(spriteBatch);
            spriteBatch.End();
        }

        /// <summary>
        /// Remove um DisplayObject da lista
        /// </summary>
        /// <param name="child">O DisplayObject</param>
        public static void Remove(DisplayObject child)
        {
            try
            {
                Children.Remove(child);
            }
            finally
            {
            }
        }

    }

}